<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
    // Object.is()
    // ES5比较两个值是否相等 只有两个运算符 相等运算符(==)和严格相等运算符(===) 
    // 前者(==)会自动转换数据类型 后者(===)NaN不等于自身 以及+0等于-0
    // Javascript缺乏一种运算 在所有环境中 只要两个值是一样的 它们就应该相等

    // ES6提出’Same-value equality‘(同值相等)算法 Object.is()就是部署这个算法的新方法。
    // 与严格比较运算符(===)的行为基本一致。

    Object.is('foo', 'foo')
    // true
    Object.is({}, {})
    // false

    // 不同之处只有两个：一是+0不等于-0，二是NaN等于自身。

    +0 === -0 //true
    NaN === NaN // false

    Object.is(+0, -0) // false
    Object.is(NaN, NaN) // true

    // ES5可以通过下面的代码 部署Object.is()
    Object.defineProperty(Object, 'is', {
        value: function(x, y) {
            if (x === y) {
            // 针对+0 不等于 -0的情况
            return x !== 0 || 1 / x === 1 / y;
            }
            // 针对NaN的情况
            return x !== x && y !== y;
        },
        configurable: true,
        enumerable: false,
        writable: true
    });

    // Object.assign()
    // Object.assign 方法用于对象的合并 将源对象的所有可枚举属性 复制到目标对象
    const target = { a: 1 };
    const source1 = { b: 2 };
    const source2 = { c: 3 };

    Object.assign(target, source1, source2);
    target // {a:1, b:2, c:3}

    
</script>